package com.example.shiwu.util;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;

public class RmsUtil {
    public static BigDecimal rmsCompute (ArrayList<BigDecimal> signal){
        if (signal == null || signal.size() == 0) {
            throw new IllegalArgumentException("Signal array cannot be null or empty");
        }

        BigDecimal sumOfSquares = BigDecimal.ZERO;

        // 计算平方和
        for (BigDecimal value : signal) {
            BigDecimal value1 = value.multiply(value);
            //System.out.println(value1);
            sumOfSquares = sumOfSquares.add(value1);
        }

        // 求平均值
        BigDecimal meanOfSquares = sumOfSquares.divide(BigDecimal.valueOf(signal.size()));

        // 求平方根
        return sqrt(meanOfSquares);

    }
    public static BigDecimal sqrt(BigDecimal value) {
        if (value.compareTo(BigDecimal.ZERO) < 0) {
            throw new IllegalArgumentException("Cannot calculate square root of a negative number");
        }

        // 初始猜测值
        BigDecimal guess = value.divide(new BigDecimal("2"), MathContext.DECIMAL128);
        BigDecimal lastGuess;

        do {
            lastGuess = guess;
            // 牛顿迭代公式
            guess = guess.add(value.divide(guess, MathContext.DECIMAL128)).divide(new BigDecimal("2"), MathContext.DECIMAL128);
        } while (guess.subtract(lastGuess).abs().compareTo(new BigDecimal("1e-15")) > 0);

        return guess;
    }

    public static void main(String[] args) {
        // 示例信号样本
        double[] signal = {1.0, 2.0, 3.0, 4.0, 5.0};
        ArrayList<BigDecimal> numbers = new ArrayList<BigDecimal>();
        numbers.add(new BigDecimal("10.5"));
        numbers.add(new BigDecimal("15.1"));
        numbers.add(new BigDecimal("12.3"));
        numbers.add(new BigDecimal("11.7"));
        numbers.add(new BigDecimal("18.9"));

        // 计算RMS值
        BigDecimal rmsValue = rmsCompute(numbers);

        // 输出结果
        System.out.println("RMS Value: " + rmsValue);

        // 创建 BigDecimal 对象
//        BigDecimal num1 = new BigDecimal("10.5");
//        BigDecimal num2 = new BigDecimal("20.3");
//        BigDecimal num3 = new BigDecimal("30.7");
//
//        // 累加操作
//        BigDecimal sum = BigDecimal.ZERO;
//        sum = sum.add(num1);
//        sum = sum.add(num2);
//        sum = sum.add(num3);
//
//        // 输出结果
//        System.out.println("累加结果为: " + sum);
    }

//    public static void main(String[] args) {
//        // 初始化一个 BigDecimal 数组
//        BigDecimal[] numbers = {
//                new BigDecimal("1.23"),
//                new BigDecimal("2.34"),
//                new BigDecimal("3.45"),
//                new BigDecimal("4.56")
//        };
//
//        // 初始化一个 BigDecimal 变量用于存储累加结果
//        BigDecimal sum = BigDecimal.ZERO;
//
//        // 使用 for 循环进行累加
//        for (BigDecimal number : numbers) {
//            sum = sum.add(number);
//        }
//
//        // 输出累加结果
//        System.out.println("累加结果: " + sum);
//    }
}
